<?php

	/**
	 * 图像处理类
	 * 功能1、图片缩略图
	 * 功能2、水印图片
	 */
	class Image{
		//保存印图和缩略图的目录 
		public $path;
		//源图宽
		private $srcWidth;
		//源图高
		private $srcHeight;
		//目标图片宽
		private $destWidth;
		// 目标图片高
		private $destHeight;
		//目标图片的类型
		private $type;
		//文件名
		private $fileName;
		//返回一个信息
// 		public $msg;
 
		
		/**
		 * 用于创建保存图片的目录
		 */
		public function __construct($path=Null){

			$path =  is_null($path)?C('IMG_PATH'):$path;
			$this->path = ltrim($path,'/').'/';
			//判断目录是否存在如果不存在就创建
			is_dir($this->path) || mkdir($this->path,0777,true);
		}
		
		/**
		 * 将水印图水印到背景图的pos的位置上
		 * @param String $waterImg   水印图
		 * @param String $bgImg   背景图
		 * @param number $pos 水印位置
		 * @param number $tran 透明度
		 */
		public function waterImage($waterImg,$bgImg,$pos=0,$tran=40){
			$waterPath = $this->path.'water/';
			//1、获得两个图片的打开资源
			//判断使用哪个函数打开这个图片资源 
			$waterSrc = $this->isImgOpen($waterImg);
			$bgImg = $this->isImgOpen($bgImg);
			//获得水印图片的宽和高
			$this->srcWidth = imagesx($waterSrc);
			$this->srcHeight = imagesy($waterSrc);
			//获得背景图片的宽和高
			$this->destWidth = imagesx($bgImg);
			$this->destHeight = imagesy($bgImg);
			//对位置进行旋转
			$posArr = $this->waterPos($pos);
			
			//将图片水印到背景图上
			imagecopymergegray($bgImg, $waterSrc, $posArr['x'], $posArr['y'], 0, 0, $this->srcWidth, $this->srcHeight, $tran);		
			//将文件输出一次
// 			$this->output($bgImg);
			//将文件保存到目录中
			if($this->save($bgImg,$waterPath)){
				echo  '<br />水印成功文件名为:'.$this->filename.'<br />';
			}
			//再将图片释放
			imagedestroy($bgImg);
			imagedestroy($waterSrc);
				
		}
		
		/**
		 * 将一个图片做成缩略图
		 * @param string $thumbImg
		 * @param string $newWidth
		 * @param string $newHeight
		 */
		public function thumb($thumbImg,$newWidth=Null,$newHeight=Null){
			//保存缩略图路径的目录 
			$thumbPath = $this->path.'thumb/';
			//如果没有传入任何新长或新宽的参数那么就按原来的比例缩小50%
			//要缩放的图片
			$bgImg = $this->isImgOpen($thumbImg);
			//获得原来的宽高
			$oldWidth = imagesx($bgImg);
			$oldHeight = imagesy($bgImg);
			
			is_null($newWidth)?$newWidth = $oldWidth * 0.5:$newWidth;
			is_null($newHeight)?$newHeight = $oldHeight * 0.5:$newHeight;
			//新键一个真彩图用来保存缩小后的图片
			$thumbImg = imagecreatetruecolor($newWidth, $newHeight);
			
			imagecopyresized($thumbImg, $bgImg, 0, 0, 0, 0, $newWidth, $newHeight, $oldWidth, $oldHeight);
			//输出 图片
// 			$this->output($thumbImg);
			if($this->save($thumbImg, $thumbPath)){
				echo  '<br />文件缩略成功:'.$this->filename.'<br />';
			}
				
			imagedestroy($thumbImg);
			imagedestroy($bgImg);
			
			
			
		}
				
		//水印后的新文件保存输出到目录中
		private function save($img,$path){
			//如果目录不存在那么就创建他
			is_dir($path) || mkdir($path,0777,true);
			$funcName = 'image'.$this->type;
			return $funcName($img,$path.$this->randomFileName());
		}	
		
		/**
		 * 将文件输出
		 * @param Source $img
		 * @param string $fileName
		 */
		public function output($img){
			$header = 'image/'.$this->type;
			header('Content-Type:'.$header);
			$funcName = 'image'.$this->type;
			$funcName($img);
		}
		
		/**
		 * 返回一个随机文件名他将水印图片保存到water目录中
		 * @param string $path
		 * @return string
		 */
		private function randomFileName(){
			$filename = time().'_'.mt_rand(0,99999).'.'.$this->type;
			$this->filename = $filename;
			return $filename;
		}
		
		/**
		 * 给水印图的位置为0-9
		 * 0为随机1-9的随机位置
		 * @param number $pos
		 * @return multitype:number
		 */
		private function waterPos($pos){
			$arr = array();
			//当传入为0的时候随机给一个水印位置
			if($pos==0){
				$pos = mt_rand(1, 9);
			}
			switch($pos){
				case 1:
					$arr['x'] = 0;
					$arr['y'] = 0;
					break;
				case 2:
					$arr['x'] = ($this->destWidth - $this->srcWidth)/2;
					$arr['y'] = 0;
					break;
				case 3:
					$arr['x'] = $this->destWidth - $this->srcWidth;
					$arr['y'] = 0;
					break;
				case 4:
					$arr['x'] = 0;
					$arr['y'] =  ($this->destHeight - $this->srcHeight)/2;
					break;
				case 5:
					$arr['x'] =  ($this->destWidth - $this->srcWidth)/2;
					$arr['y'] =  ($this->destHeight - $this->srcHeight)/2;
					break;
				case 6:
					$arr['x'] =  $this->destWidth - $this->srcWidth;
					$arr['y'] =  ($this->destHeight - $this->srcHeight)/2;
					break;
				case 7:
					$arr['x'] =  0;
					$arr['y'] =  $this->destHeight - $this->srcHeight;
					break;
				case 8:
					$arr['x'] =  ($this->destWidth - $this->srcWidth)/2;
					$arr['y'] =  $this->destHeight - $this->srcHeight;
					break;
				case 9:
					$arr['x'] =  $this->destWidth - $this->srcWidth;
					$arr['y'] =  $this->destHeight - $this->srcHeight;
					break;
			}
			return $arr;
		}
		
		
		/**
		 * 返回一个图片资源  自动判断使用哪个函数打开图片
		 * 使用imagecreatefrom系列函数打开一个图片并返回一个资源
		 * @param string $imgSrc
		 */
		private function isImgOpen($imgSrc){
			//先要获得他的mime类型这样得到后面的那个类型 
			//再组合函数就可以得到整个打开资源的函数
			$type = ltrim(strchr(getimagesize($imgSrc)['mime'],'/'),'/');
			$this->type = $type;
			$funcName = 'imagecreatefrom'.$type;
			//使用变量函数返回相应要打开图片格式的函数再调用他返回这个资源 
			return $funcName($imgSrc);
		} 

		
	}
